向对象 person 添加什么时,可以通过执行 [...person] 获得类似 ["Lydia Hallie", 21] 的输出?
javascript
const person = {
name: "Lydia Hallie",
age: 21
}
[...person] // ["Lydia Hallie", 21]A. 不需要,对象默认就是可迭代的 B. *Symbol.iterator { for (let x in this) yield this[x] } C. Symbol.iterator { for (let x in this) yield Object.values(this) } D. *Symbol.iterator
答案: B
解析:
对象默认并不是可迭代的。
如果迭代规则被定义,则一个对象是可迭代的(An iterable is an iterable if the iterator protocol is present)。
我们可以通过添加迭代器symbol [Symbol.iterator] 来定义迭代规则,其返回一个 generator 对象,比如说构建一个 generator 函数 *[Symbol.iterator]() {}。
如果我们想要返回数组 ["Lydia Hallie", 21]: yield* Object.values(this),这个 generator 函数一定要 yield 对象 person 的 values 。
另外,本题还需要注意的一个点:
- yield 关键字用来暂停和恢复一个生成器函数(function*)
- yield* 表达式用于委托给另一个 generator 或可迭代对象。
js
const person = {
name: 'lzh',
age: 21
}
// 方法一
person[Symbol.iterator] = function* () {
yield* Object.values(this)
}
// 方法二
person[Symbol.iterator] = function* () {
for (let x in this) {
yield this[x]
}
}
console.log([...person]); //['lzh', 21]